# -*- coding: utf-8 -*-
"""
xfree.utils.search
这个模块包含了 xfree 应用的全文搜索相关的所有搜索处理器。

版权所有 (c) 2016 由 xfree 团队所有。
许可证为 BSD，详情请见 LICENSE 文件。
"""

import logging

import whoosh
from flask_whooshee import AbstractWhoosheer

from xfree.forum.models import Forum, Post, Topic
from xfree.user.models import User

# 创建日志记录器
logger = logging.getLogger(__name__)


class PostWhoosheer(AbstractWhoosheer):
    """
    帖子搜索处理器。
    """
    # 关联的模型为 Post
    models = [Post]

    # 定义搜索索引模式
    schema = whoosh.fields.Schema(
        post_id=whoosh.fields.NUMERIC(stored=True, unique=True),
        username=whoosh.fields.TEXT(),
        modified_by=whoosh.fields.TEXT(),
        content=whoosh.fields.TEXT(),
    )

    @classmethod
    def update_post(cls, writer, post):
        """
        更新帖子在搜索索引中的信息。
        参数：
            writer：索引写入器。
            post：帖子实例。
        """
        writer.update_document(
            post_id=post.id,
            username=str(post.username),
            modified_by=str(post.modified_by),
            content=str(post.content),
        )

    @classmethod
    def insert_post(cls, writer, post):
        """
        将新帖子添加到搜索索引中。
        参数：
            writer：索引写入器。
            post：帖子实例。
        """
        writer.add_document(
            post_id=post.id,
            username=str(post.username),
            modified_by=str(post.modified_by),
            content=str(post.content),
        )

    @classmethod
    def delete_post(cls, writer, post):
        """
        从搜索索引中删除帖子。
        参数：
            writer：索引写入器。
            post：帖子实例。
        """
        writer.delete_by_term("post_id", post.id)


class TopicWhoosheer(AbstractWhoosheer):
    """
    主题搜索处理器。
    """
    models = [Topic]

    schema = whoosh.fields.Schema(
        topic_id=whoosh.fields.NUMERIC(stored=True, unique=True),
        title=whoosh.fields.TEXT(),
        username=whoosh.fields.TEXT(),
        content=whoosh.fields.TEXT(),
    )

    @classmethod
    def update_topic(cls, writer, topic):
        """
        更新主题在搜索索引中的信息。
        参数：
            writer：索引写入器。
            topic：主题实例。
        """
        writer.update_document(
            topic_id=topic.id,
            title=str(topic.title),
            username=str(topic.username),
            content=str(getattr(topic.first_post, "content", None)),
        )

    @classmethod
    def insert_topic(cls, writer, topic):
        """
        将新主题添加到搜索索引中。
        参数：
            writer：索引写入器。
            topic：主题实例。
        """
        writer.add_document(
            topic_id=topic.id,
            title=str(topic.title),
            username=str(topic.username),
            content=str(getattr(topic.first_post, "content", None)),
        )

    @classmethod
    def delete_topic(cls, writer, topic):
        """
        从搜索索引中删除主题。
        参数：
            writer：索引写入器。
            topic：主题实例。
        """
        writer.delete_by_term("topic_id", topic.id)


class ForumWhoosheer(AbstractWhoosheer):
    """
    论坛搜索处理器。
    """
    models = [Forum]

    schema = whoosh.fields.Schema(
        forum_id=whoosh.fields.NUMERIC(stored=True, unique=True),
        title=whoosh.fields.TEXT(),
        description=whoosh.fields.TEXT(),
    )

    @classmethod
    def update_forum(cls, writer, forum):
        """
        更新论坛在搜索索引中的信息。
        参数：
            writer：索引写入器。
            forum：论坛实例。
        """
        writer.update_document(
            forum_id=forum.id,
            title=str(forum.title),
            description=str(forum.description),
        )

    @classmethod
    def insert_forum(cls, writer, forum):
        """
        将新论坛添加到搜索索引中。
        参数：
            writer：索引写入器。
            forum：论坛实例。
        """
        writer.add_document(
            forum_id=forum.id,
            title=str(forum.title),
            description=str(forum.description),
        )

    @classmethod
    def delete_forum(cls, writer, forum):
        """
        从搜索索引中删除论坛。
        参数：
            writer：索引写入器。
            forum：论坛实例。
        """
        writer.delete_by_term("forum_id", forum.id)


class UserWhoosheer(AbstractWhoosheer):
    """
    用户搜索处理器。
    """
    models = [User]

    schema = whoosh.fields.Schema(
        user_id=whoosh.fields.NUMERIC(stored=True, unique=True),
        username=whoosh.fields.TEXT(),
        email=whoosh.fields.TEXT(),
    )

    @classmethod
    def update_user(cls, writer, user):
        """
        更新用户在搜索索引中的信息。
        参数：
            writer：索引写入器。
            user：用户实例。
        """
        writer.update_document(
            user_id=user.id, username=str(user.username), email=str(user.email)
        )

    @classmethod
    def insert_user(cls, writer, user):
        """
        将新用户添加到搜索索引中。
        参数：
            writer：索引写入器。
            user：用户实例。
        """
        writer.add_document(
            user_id=user.id, username=str(user.username), email=str(user.email)
        )

    @classmethod
    def delete_user(cls, writer, user):
        """
        从搜索索引中删除用户。
        参数：
            writer：索引写入器。
            user：用户实例。
        """
        writer.delete_by_term("user_id", user.id)